#include "JuegoServerImp.h"
#include "Jugador.h"
#include "EstadoDeEsperaDeJugadores.h"
#include "EstadoDePreparacionDePartida.h"
#include "RealizacionDePartida.h"
#include <iostream>

using namespace std;

JuegoServerImp::JuegoServerImp(unsigned int cantidadDeJugadores, Mapa* mapa, TiradorDeDados* tiradorDeDados) {
	turno = 0;
	this->cantidadDeJugadores = cantidadDeJugadores;
	this->mapaDelJuego = mapa;
	this->tiradorDeDados = tiradorDeDados;
	estadoDeEsperaDeJugadores = new EstadoDeEsperaDeJugadores(this);
	estadoDePreparacionDePartida = new EstadoDePreparacionDePartida(this);
	estadoDeRealizacionDePartida = new RealizacionDePartida(this);
	
	if (cantidadDeJugadores > 1)
		this->estadoDelJuego = estadoDeEsperaDeJugadores;
}

JuegoServerImp::JuegoServerImp(unsigned int cantidadDeJugadores, Mapa* mapa, TiradorDeDados* tiradorDeDados, NotificadorDeCambios* notificadorDeCambios) {
	JuegoServerImp(cantidadDeJugadores,mapa,tiradorDeDados);
	this->notificadorDeCambios = notificadorDeCambios;
}

void JuegoServerImp::unirse(Jugador* jugador) {
		this->estadoDelJuego->unirse(jugador);
}

void JuegoServerImp::realizarAtaque(Ataque* ataque) {
	if (ataque->getJugadorAtacante()->equals(jugadores[turno]))
		this->estadoDelJuego->realizarAtaque(ataque);
	else
		;//throw new Exception("no es tu turno");
}

void JuegoServerImp::colocarEjercitos(Jugador* jugador, Territorio* territorio, unsigned int cantidadDeEjercitos) {
	if (jugador->equals(jugadores[turno]))
		this->estadoDelJuego->colocarEjercitos(jugador,territorio,cantidadDeEjercitos);
	else
		;//throw new Exception("no es tu turno");
}

void JuegoServerImp::moverEjercitos(Jugador* jugador, Territorio* origen, Territorio* destino, unsigned int cantidadDeEjercitos)  {
	if (jugador->equals(jugadores[turno]))
		this->estadoDelJuego->moverEjercitos(jugador,origen,destino,cantidadDeEjercitos);
	else
		;//throw new Exception("no es tu turno");
}

void JuegoServerImp::pasar(Jugador* jugador) {
	if (jugador->equals(jugadores[turno]))
		this->pasarAlSiguienteTurno();
}

Mapa* JuegoServerImp::getMapa() {
	return mapaDelJuego;
}

TiradorDeDados* JuegoServerImp::getTiradorDeDados() {
	return tiradorDeDados;
}

void JuegoServerImp::setEstado(EstadoDelJuego* estado) {
	this->estadoDelJuego = estado;
}

EstadoDelJuego* JuegoServerImp::getEstadoDeEsperaJugadores() {
	return estadoDeEsperaDeJugadores;
}

EstadoDelJuego* JuegoServerImp::getEstadoDePreparacionDePartida() {
	return estadoDePreparacionDePartida;
}

EstadoDelJuego* JuegoServerImp::getEstadoDeRealizacionDePartida() {
	return estadoDeRealizacionDePartida;
}

vector<Jugador*>* JuegoServerImp::getJugadores() {
	return &jugadores;
}

Jugador* JuegoServerImp::getJugador(string colorJugador) {
	for (int i = 0; i<cantidadDeJugadores; i++)
		if (jugadores[i]->getColor() == colorJugador)
			return jugadores[i];
}

unsigned int JuegoServerImp::getCantidadDeJugadores() {
	return cantidadDeJugadores;
}

Jugador* JuegoServerImp::getJugadorEnTurno() {
	return jugadores[turno];
}

void JuegoServerImp::pasarAlSiguienteTurno() {
	if (turno == cantidadDeJugadores - 1)
		turno = 0;
	else
		turno++;
	//notificadorDeCambios->update(this);
}

void JuegoServerImp::setTurno(int turno) {
	this->turno = turno;
}

void JuegoServerImp::abandonar(Jugador* jugador) {
	
}

void JuegoServerImp::quitarJugador(string colorJugador) {
	for (int i=0; i<this->cantidadDeJugadores; i++)
		if (jugadores[i]->getColor() == colorJugador)
			jugadores.erase(jugadores.begin()+i);
}

void JuegoServerImp::imprimirEstado() {
	cout<<"Estado del Juego"<<endl<<endl;
	cout<<"Cantidad de Jugadores : "<<getCantidadDeJugadores()<<endl;
	getMapa()->imprimirEstado();
}

JuegoServerImp::~JuegoServerImp()
{
	delete estadoDeEsperaDeJugadores;
	delete estadoDePreparacionDePartida;
	delete estadoDeRealizacionDePartida;
}
